歡迎來到第 19 天,今天要承接昨天所提到 IG 的無限捲軸爬蟲。
由於 IG 是一個典型的非同步網頁,在使用者觸發了某個事件後,會產生新的 XHR 進行非同步更新,也就是因為這個原因,我們昨天的靜態爬蟲只爬到了一進頁面後的前幾張照片。
首先同樣的步驟,先手動的進行搜尋功能,並觀察觸發事件後的 Network 狀態,在進入搜尋結果的頁面後,往下滾動會發現 Network 產生出新的 XHR 的資料傳遞(可以點選 Network 中的 XHR 標籤,鎖定顯示這類活動的紀錄)
在這個 GET
的請求中,會發現他的參數應該是經過雜湊的轉換,因此並不方便透過靜態爬蟲的方式直接進行請求,因此還是會使用 Selenium 進行爬蟲。
這裡將會省略模擬登入的步驟,如需閱覽模擬登入,請參考 [Day 17] Instagram - 模擬登入。首先先轉移至目標頁面,這次直接用 GET
進入柴犬 Maru 的 IG 頁面,接下來透過 Selenium 的 execute
方式在 Chrome 中執行 Javascript 程式碼操作頁面下滑,並在之後讀取所有照片的位置,並使用 requests.get()
的方式取得照片。
# 省略以上登入程序及 import 程式碼
driver.get("https://www.instagram.com/marutaro/?hl=zh-tw")
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
photo_tag = driver.find_elements_by_xpath("//div[@class='KL4Bh']/img")
for i, photo in enumerate(photo_tag):
with open(f'{os.getcwd()}/maru/maru_{i}.png','wb') as f:
f.write(requests.get(photo.get_attribute("src")).content)
這樣就完成了無限捲軸的圖片爬蟲!當然可以搭配前幾天提過的 WebDriverWait
方式及迴圈進行更多的圖片下載。
那今天就到這裡!我們明天見!